AArch64 MinCamlでmin-rtを動かしてみる
https://gyazo.com/10b8e255ee8686c67bdec723dd56a5e3
globals.s を用意する
code:min-rt/AArch64/globals.s
.data
.comm min_caml_objects, 480, 3
.comm min_caml_size, 16, 3
.comm min_caml_dbg, 8, 3
.comm min_caml_screen, 24, 3
.comm min_caml_vp, 24, 3
.comm min_caml_view, 24, 3
.comm min_caml_light, 24, 3
.comm min_caml_cos_v, 16, 3
.comm min_caml_sin_v, 16, 3
.comm min_caml_beam, 8, 3
.comm min_caml_and_net, 400, 3
.comm min_caml_or_net, 8, 3
.comm min_caml_temp, 112, 3
.comm min_caml_cs_temp, 128, 3
.comm min_caml_solver_dist, 8, 3
.comm min_caml_vscan, 24, 3
.comm min_caml_intsec_rectside, 8, 3
.comm min_caml_tmin, 8, 3
.comm min_caml_crashed_point, 24, 3
.comm min_caml_crashed_object, 8, 3
.comm min_caml_end_flag, 8, 3
.comm min_caml_viewpoint, 24, 3
.comm min_caml_nvector, 24, 3
.comm min_caml_rgb, 24, 3
.comm min_caml_texture_color, 24, 3
.comm min_caml_solver_w_vec, 24, 3
.comm min_caml_chkinside_p, 24, 3
.comm min_caml_isoutside_q, 24, 3
.comm min_caml_nvector_w, 24, 3
.comm min_caml_scan_d, 8, 3
.comm min_caml_scan_offset, 8, 3
.comm min_caml_scan_sscany, 8, 3
.comm min_caml_scan_met1, 8, 3
.comm min_caml_wscan, 24, 3
ビルド
code:sh
make min-caml
cd min-rt
make min-rt.min-caml
-m32 は不要なので削除
code:diff
diff --git a/min-rt/Makefile b/min-rt/Makefile
index 7157ccd..b33a548 100644
--- a/min-rt/Makefile
+++ b/min-rt/Makefile
@@ -23,7 +23,7 @@ ppmdiff: ppm.ml diff.ml
time ./min-rt.min-caml < $< > $@.tmp
mv $@.tmp $@
min-rt.min-caml: min-rt.s globals.s ../libmincaml.S ../stub.c
- gcc -m32 -g -O2 -Wall $^ -lm -o min-rt.min-caml
+ gcc -g -O2 -Wall $^ -lm -o min-rt.min-caml
min-rt.s: min-rt.ml ../min-caml
../min-caml -inline 100 min-rt
エラー。以下の関数を実装せねば。
_min_caml_atan
_min_caml_cos
_min_caml_floor
_min_caml_print_byte
_min_caml_read_float
_min_caml_read_int
_min_caml_sin
雑に実装した。
code:diff
commit b349698a1d967486218165cb53b0defe2d241d08
Author: takashi hatakeyama <takashi.hatakeyama@gmail.com>
Date: Fri Feb 17 23:55:02 2023 +0900
min-rt に必要な関数を雑に実装
diff --git a/stub.c b/stub.c
index e6a97c3..abb324b 100644
--- a/stub.c
+++ b/stub.c
@@ -1,5 +1,6 @@
+#include <math.h>
extern int min_caml_start(char *, char *);
@@ -17,14 +18,52 @@ int main() {
return 0;
}
-void min_caml_print_int(int n) {
- printf("%d", n);
+void min_caml_print_int(long n) {
+ printf("%ld", n);
}
-void min_caml_print_float(double n) {
- printf("%lf", n);
+void min_caml_print_float(double d) {
+ printf("%lf", d);
+}
+
+void min_caml_print_byte(long n) {
+ char c[] = {0};
+ printf("%s", c);
+}
+
+long min_caml_read_int() {
+ long n;
+ scanf("%ld", &n);
+ return n;
+}
+
+double min_caml_read_float() {
+ double d;
+ scanf("%lf", &d);
+ return d;
}
void min_caml_print_newline() {
printf("\n");
}
+
+// atan
+double min_caml_atan(double x) {
+ return atan(x);
+}
+
+// cos
+double min_caml_cos(double x) {
+ return cos(x);
+}
+
+// floor
+double min_caml_floor(double x) {
+ return floor(x);
+}
+
+// sin
+double min_caml_sin(double x) {
+ return sin(x);
+}
ビルドできたので実行してみる
code:sh
cd min-rt
./min-rt.min-caml < contest.sld > contest.ppm
ごみファイルを残して消えていった...
https://gyazo.com/001af9ee6761ce24b6e825e3ea1f5daf
デバッガを起動
code:sh
lldb min-rt.min-caml
lldbの各種コマンド
code:sh
# 実行開始
run
# ブレークポイントをセット
br set --name min_caml_start
code:sh
make clean && make min-rt.min-caml && ./min-rt.min-caml < ball.sld > ball.ppm
黒い画像が出力される...なぜ...
https://gyazo.com/f8979596f4865393596450939770c8ca
画像をめっちゃ小さくする
rt の引数の数字を小さくすることで出力される画像の画素数をめっちゃ小さくできる。これで調べる範囲がグッと縮まる...かもしれない。
code:min-rt.ml
-rt 768 768 false
+rt 3 3 false
write_rgb をバイナリからテキストにする
print_byte が出力するバイナリだとデバッグが難しいので、print_int にすると差異を確認しやすい。また、そのままヘッダを P3形式 P3 に書き換えればそのまま正しい形式のPPMファイルになるのでおすすめ。
code:ml
(**** データ出力 ****)
(*MINCAML*)let rec write_rgb _ =
(*NOMINCAML let write_rgb _ =*)
(
let red = int_of_float rgb.(0) in
let red = if red > 255 then 255 else red in
(* print_byte red; *)
print_int red;
let green = int_of_float rgb.(1) in
let green = if green > 255 then 255 else green in
(* print_byte green; *)
print_byte 32;
print_int green;
let blue = int_of_float rgb.(2) in
let blue = if blue > 255 then 255 else blue in
(* print_byte blue *)
print_byte 32;
print_int blue;
print_byte 32
)
in
OCamlとMinCamlの出力を比較する
以下のコマンドを叩くと OCaml と MinCaml のレイトレが走って結果を比較してくれる。print 文を入れておけば diff も表示してくれて、差異がどこにあるのか分かりやすくて良いと思う。
code:sh
make clean && make ball.cmp
動いた〜〜〜〜🎉🎉🎉🎉🎉🎉
https://gyazo.com/10b8e255ee8686c67bdec723dd56a5e3
print_byte がバグってるせいで黒い画像が出力されていたみたい。 P3形式にして print_int で出力することで無事にレイトレの結果を出力できた〜〜〜〜〜〜
print_byte を直すのはまた気が向いたら。
関連